Simulated annealing, a Monte Carlo method for combinatorial optimization